<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Fonts Module Level 4: parsing @font-palette-values</title>
<link rel="help" href="https://drafts.csswg.org/css-fonts/#font-palette-values">
<meta name="assert" content="@font-palette-values is parsed correctly.">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<style id="style">
/* 0 */
@font-palette-values --A {
}

/* 1 */
@font-palette-values --B {
    font-weight: 400;
}

/* 2 */
@font-palette-values --C {
    font-family: foo;
    font-family: bar;
    base-palette: 1;
    base-palette: "baz";
    base-palette: 2;
    override-colors: "a" #123;
    override-colors: 3 #123;
    override-colors: "b" #123;
}

/* 3 */
@font-palette-values --D {
    base-palette: "foo";
    base-palette: 1;
    base-palette: "bar";
    override-colors: 3 #123;
    override-colors: "baz" #123;
    override-colors: 4 #123;
}

/* 4 */
@font-palette-values --E {
    override-colors: 3 rgb(17, 34, 51);
    override-colors: 3 rgb(68, 85, 102);
}

/* 5 */
@font-palette-values --F {
    font-family: "foo";
}

/* 6 */
@font-palette-values --G {
    override-colors: 3 rgb(17, 34, 51), 4 rgb(68, 85, 102);
}

/* 7 */
@font-palette-values --H {
    override-colors: 3 rgb(17, 34, 51), 3 rgb(68, 85, 102);
}

/* 8 */
@font-palette-values --I {
    override-colors: 0 #0000FF;
}

/* 9 */
@font-palette-values --J {
    override-colors: 0 green;
}

/* 10 */
@font-palette-values --K {
    override-colors: 0 transparent;
}

/* 11 */
@font-palette-values --L {
    override-colors: 0 rgba(1 2 3 / 4);
}

/* 12 */
@font-palette-values --M {
    override-colors: 0 lab(29.2345% 39.3825 20.0664);
}

/* 13 */
@font-palette-values --N {
    override-colors: 0 color(display-p3 100% 100% 100%);
}

/* 14 */
@font-palette-values --O {
    override-colors: 0 transparent;
}

/* 15 */
@font-palette-values -- {
}

/* 16 */
@font-palette-values --P {
    font-family: foo, bar, baz;
}

/* 17 */
@font-palette-values --Q {
    override-colors: 0 color-mix(in lch, red, blue);
}

/* 18 */
@font-palette-values --R {
    override-colors: 0 color-mix(in lch, color-mix(in lch, red, blue), color-mix(in lch, green, white));
}
</style>
</head>
<body>
<script>
let rules = document.getElementById("style").sheet.cssRules;
let supports_lab = CSS.supports('color', 'lab(29.2345% 39.3825 20.0664)');
let supports_display_p3_color_space =
    CSS.supports('color', 'color(display-p3 100% 100% 100%)');

test(function() {
    let text = rules[0].cssText;
    assert_not_equals(text.indexOf("@font-palette-values "), -1);
    assert_not_equals(text.indexOf(" --A "), -1);
    assert_not_equals(text.indexOf("{"), -1);
    assert_not_equals(text.indexOf("}"), -1);
    assert_equals(text.indexOf("font-family"), -1);
    assert_equals(text.indexOf("base-palette"), -1);
    assert_equals(text.indexOf("override-colors"), -1);
});

test(function() {
    let rule = rules[0];
    assert_equals(rule.constructor.name, "CSSFontPaletteValuesRule");
    assert_equals(rule.name, "--A");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors, "");
});

test(function() {
    let text = rules[1].cssText;
    assert_equals(text.indexOf("font-weight"), -1);
});

test(function() {
    let rule = rules[1];
    assert_equals(rule.name, "--B");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors, "");
});

test(function() {
    let text = rules[2].cssText;
    assert_equals(text.indexOf("font-family: foo;"), -1);
    assert_not_equals(text.indexOf("font-family: bar;"), -1);
    assert_equals(text.indexOf("base-palette: 1;"), -1);
    assert_equals(text.indexOf("base-palette: \"baz\""), -1);
    assert_not_equals(text.indexOf("base-palette: 2;"), -1);
    assert_equals(text.indexOf("override-colors: \"a\""), -1);
    assert_not_equals(text.indexOf("override-colors: 3"), -1);
    assert_equals(text.indexOf("override-colors: \"b\""), -1);
});

test(function() {
    let rule = rules[2];
    assert_equals(rule.name, "--C");
    assert_equals(rule.fontFamily, "bar");
    assert_equals(rule.basePalette, "2");
    assert_equals(rule.overrideColors, "3 rgb(17, 34, 51)");
});

test(function() {
    let text = rules[3].cssText;
    assert_equals(text.indexOf("base-palette: \"foo\";"), -1);
    assert_not_equals(text.indexOf("base-palette: 1"), -1);
    assert_equals(text.indexOf("base-palette: \"bar\";"), -1);
    assert_equals(text.indexOf("override-colors: 3"), -1);
    assert_equals(text.indexOf("override-colors: \"baz\""), -1);
    assert_not_equals(text.indexOf("override-colors: 4"), -1);
});

test(function() {
    let rule = rules[3];
    assert_equals(rule.name, "--D");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "1");
    assert_equals(rule.overrideColors.indexOf("),"), -1);
    assert_equals(rule.overrideColors.indexOf("4 "), 0);
    assert_not_equals(rule.overrideColors.indexOf("rgb"), -1);
});

test(function() {
    let text = rules[4].cssText;
    assert_equals(text.indexOf("51"), -1);
    assert_not_equals(text.indexOf("102"), -1);
});

test(function() {
    let rule = rules[4];
    assert_equals(rule.name, "--E");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors.indexOf("),"), -1);
    assert_equals(rule.overrideColors.indexOf("3 "), 0);
    assert_not_equals(rule.overrideColors.indexOf("102"), -1);
});

test(function() {
    let text = rules[5].cssText;
    assert_not_equals(text.indexOf("foo"), -1);
});

test(function() {
    let rule = rules[5];
    assert_equals(rule.name, "--F");
    assert_in_array(rule.fontFamily, ["foo", "\"foo\""]);
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors, "");
});

test(function() {
    let text = rules[6].cssText;
    assert_not_equals(text.indexOf("51"), -1);
    assert_not_equals(text.indexOf("102"), -1);
});

test(function() {
    let rule = rules[6];
    assert_equals(rule.name, "--G");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors.split("),").length, 2);
    assert_equals(rule.overrideColors.indexOf("3 "), 0);
    assert_not_equals(rule.overrideColors.indexOf("), 4 "), -1);
    assert_not_equals(rule.overrideColors.indexOf("51"), -1);
    assert_not_equals(rule.overrideColors.indexOf("102"), -1);
});

test(function() {
    let text = rules[7].cssText;
    assert_not_equals(text.indexOf("51"), -1);
    assert_not_equals(text.indexOf("102"), -1);
});

test(function() {
    let rule = rules[7];
    assert_equals(rule.name, "--H");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_not_equals(rule.overrideColors.indexOf("),"), -1);
    assert_equals(rule.overrideColors.indexOf("3 "), 0);
    assert_not_equals(rule.overrideColors.indexOf("), 3 "), -1);
    assert_not_equals(rule.overrideColors.indexOf("51"), -1);
    assert_not_equals(rule.overrideColors.indexOf("102"), -1);
});

test(function() {
    let text = rules[8].cssText;
    assert_not_equals(text.indexOf("override-colors"), -1);
    assert_not_equals(text.indexOf("rgb(0, 0, 255)"), -1);
});

test(function() {
    let rule = rules[8];
    assert_equals(rule.name, "--I");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors.indexOf("),"), -1);
    assert_not_equals(rule.overrideColors.indexOf("rgb(0, 0, 255)"), -1);
});

test(function() {
    let text = rules[9].cssText;
    assert_not_equals(text.indexOf("override-colors"), -1);
    assert_true(text.includes("rgb(0, 128, 0)") ||
                text.includes("green"));
});

test(function() {
    let rule = rules[9];
    assert_equals(rule.name, "--J");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors.indexOf("),"), -1);
    assert_true(rule.overrideColors.includes("rgb(0, 128, 0)") ||
                rule.overrideColors.includes("green"))
});

test(function() {
    let text = rules[10].cssText;
    assert_not_equals(text.indexOf("override-colors"), -1);
    assert_true(text.includes("rgba(0, 0, 0, 0)") ||
                text.includes("transparent"));
});

test(function() {
    let rule = rules[10];
    assert_equals(rule.name, "--K");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors.indexOf("),"), -1);
    assert_true(rule.overrideColors.includes("rgba(0, 0, 0, 0)") ||
                rule.overrideColors.includes("transparent"));
});

test(function() {
    let text = rules[11].cssText;
    assert_not_equals(text.indexOf("override-colors"), -1);
    assert_not_equals(text.indexOf("2"), -1);
});

test(function() {
    let rule = rules[11];
    assert_equals(rule.name, "--L");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors.indexOf("),"), -1);
    assert_not_equals(rule.overrideColors.indexOf("2"), -1);
});

test(function() {
    let text = rules[12].cssText;
    if (supports_lab) {
        assert_not_equals(text.indexOf("override-colors"), -1);
        assert_not_equals(text.indexOf("29"), -1);
    }
});

test(function() {
    let rule = rules[12];
    assert_equals(rule.name, "--M");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    if (supports_lab) {
        assert_equals(rule.overrideColors.indexOf("),"), -1);
        assert_not_equals(rule.overrideColors.indexOf("lab"), -1);
    }
});

test(function() {
    let text = rules[13].cssText;
    if (supports_display_p3_color_space) {
        assert_not_equals(text.indexOf("override-colors"), -1);
        assert_not_equals(text.indexOf("display-p3"), -1);
    }
});

test(function() {
    let rule = rules[13];
    assert_equals(rule.name, "--N");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    if (supports_display_p3_color_space) {
        assert_equals(rule.overrideColors.indexOf("),"), -1);
        assert_not_equals(rule.overrideColors.indexOf("display-p3"), -1);
    }
});

test(function() {
    let text = rules[14].cssText;
    assert_not_equals(text.indexOf("override-colors"), -1);
});

test(function() {
    let rule = rules[14];
    assert_equals(rule.name, "--O");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_not_equals(rule.overrideColors, "");
});

test(function() {
    let text = rules[15].cssText;
    assert_not_equals(text.indexOf("--"), -1);
});

test(function() {
    let rule = rules[15];
    assert_equals(rule.name, "--");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors, "");
});

test(function() {
    let rule = rules[16];
    assert_equals(rule.name, "--P");
    assert_equals(rule.fontFamily, "foo, bar, baz");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors, "");
});

test(function() {
    let rule = rules[17];
    assert_equals(rule.name, "--Q");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors, "0 color-mix(in lch, red, blue)");
});

test(function() {
    let rule = rules[18];
    assert_equals(rule.name, "--R");
    assert_equals(rule.fontFamily, "");
    assert_equals(rule.basePalette, "");
    assert_equals(rule.overrideColors, "0 color-mix(in lch, color-mix(in lch, red, blue), color-mix(in lch, green, white))");
});
</script>
</body>
</html>
